# @Time : 2024-11-02 16:41
# @Author : Fioman 
# @Phone : 13149920693
"""
Queue模块提供了一个线程安全的数据结构
1) queue.Queue使用了内置的锁来管理队列数据的并发访问.queue操作的时候会上锁,操作完再释放锁
2) 使用threading.Condition 来管理队列的变满或者变空,并通知等待的线程
"""
import threading
import time

"""
主要方法:
1) put(item,block=True,timeout=None)
将item放入队列,默认阻塞,直到等待有空闲的空间
2) get(block=True,timeout=None) 
从队列的头部获取一个项目(先进先出),如果block=True,操作将阻塞直到有项目可用
3) task_done() 
表示一个队列中的任务处理完成.通常与join()配合使用.只有当所有的get()的内容的task_done()都结束的时候
# join()才会继续往执行,不然join()就一直阻塞在那里,注意这里是所有的get()队列中的值都做了task_done()
才可以
4) join()
"""
from queue import Queue


def producer(q: Queue, n):
    for i in range(n):
        item = f"item-{i}"
        q.put(item)
        print(f"Producing {item}")
        time.sleep(0.5)
    q.put("Done")  # 生产结束的信号


def comsumer(q: Queue):
    while True:
        item = q.get()
        if item is None:
            continue
        if item == "Done":
            q.task_done()  # 表示任务完成
            break
        print(f"Consumed {item}")
        q.task_done()  # 表示任务完成
        time.sleep(0.5)


# 创建队列
q = Queue()
producerThread = threading.Thread(target=producer, args=(q, 5))
producerThread.start()

consumerThread = threading.Thread(target=comsumer, args=(q,))
consumerThread.start()

producerThread.join()
consumerThread.join()

# 确保所有的任务已经完成
q.join()
print("All task are done")
